using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Criterion;
using Didsoft.DataAccess.NHibernate;
using Didsoft.DataAccess.Contracts;
using Boa.HD.AccesoDatos.Entidades;
using Boa.HD.AccesoDatos.Contratos;
using Boa.HD.AccesoDatos.Entidades.DTO;
using Didsoft.DataAccess.NHibernate.Extensions;

namespace Boa.HD.AccesoDatos.Contexto
{
   public class HD_AsignacionTecnicoProblemaAccesoDatos : DataAccessBase<HD_AsignacionTecnicoProblema>, IHD_AsignacionTecnicoProblemaAccesoDatos
   {
     public HD_AsignacionTecnicoProblemaAccesoDatos()
     {
     }
     
     /// <summary>
     /// Devuelve una lista IList<HD_AsignacionTecnicoProblema> con todas las ocurrencias encontradas, en base a filtro.
     /// </summary>
     /// <param name="filtro"></param>
     /// <returns></returns>
     public IList<HD_AsignacionTecnicoProblema> BuscarPorFiltro(string filtro)
     {
         var hql = "from HD_AsignacionTecnicoProblema atp where atp.Tecnico.Nombre like :filtro order by atp.DefinicionProblema.Id";
         var query = Session.CreateQuery(hql);
         query.SetAnsiString("filtro", filtro + "%");
         return query.List<HD_AsignacionTecnicoProblema>();
     }


     public IList<HD_AsignacionTecnicoProblema> ObtenerPorTecnicoId(int tecnicoId)
     {
         var hql = "from HD_AsignacionTecnicoProblema atp where atp.Tecnico.Id = :tecnicoId";
         var query = Session.CreateQuery(hql);
         query.SetInt32("tecnicoId", tecnicoId);
         return query.List<HD_AsignacionTecnicoProblema>();
     
     }

     public IList<HD_AsignacionTecnicoProblema> ObtenerPorDefinicionProblemaIdNoAtenidos(int definicionProblemaId)
     {
         var hql = @"from HD_AsignacionTecnicoProblema atp where atp.DefinicionProblema.Id = :definicionProblemaId";
         var query = Session.CreateQuery(hql);
         query.SetInt32("definicionProblemaId", definicionProblemaId);
         return query.List<HD_AsignacionTecnicoProblema>();
     }


     public IList<DtoTecnicoHoraAsignada> TecnicosConTareasAsignadas(int definicionProblemaId)
     {
         var sql = @"select  atp.AsignacionTecnicoProblemaId,
	                            NombreTecnico = t.Nombre,
	                            dp.DefinicionProblemaId,
	                            NombreProblema = dp.Nombre,
		                        MinutosOcupados = SUM(case when hpa.HistoriaProblemaAsistidoId is not null 
							                          then dp.MinutosEstimacionSolucion else 0 end)

                        from HD_AsignacionTecnicoProblema atp
                        inner join HD_Tecnico t on t.TecnicoId = atp.TecnicoId and t.EsExterno = 0
                        inner join HD_DefinicionProblema dp on dp.DefinicionProblemaId = atp.DefinicionProblemaId
                        left join HD_HistoriaProblemaAsistido hpa on hpa.AsignacionTecnicoProblemaId = atp.AsignacionTecnicoProblemaId 
                              and (hpa.EstadoTrabajoId not in (select et.EstadoTrabajoId from HD_EstadoTrabajo et where et.EsCerrado = 1))
      
                        where dp.DefinicionProblemaId = :definicionProblemaId
                        group by atp.AsignacionTecnicoProblemaId,
		                         t.Nombre,
		                         dp.DefinicionProblemaId,
		                         dp.Nombre
                        order by MinutosOcupados";
         var query = Session.CreateSQLQuery(sql);
         query.SetInt32("definicionProblemaId", definicionProblemaId);
         return query.ListBeanTransformer<DtoTecnicoHoraAsignada>();
     }

     
   }
}

